# 导入用户中心蓝图
from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request
from flask import session

from info import constants
from info import db
from info.models import Category, News
from info.utils.image_storage import storage
from info.utils.response_code import RET
from . import profile_api
# 导入检验登陆装饰器
from info.utils.commons import login_required


# 用户中心
@profile_api.route('/info')
@login_required
def user_info():
    """
    个人中心的基本页面:
    1 尝试获取用户信息
    2 如果用户未登录
    3 重定向到首页
    4 如果用户登陆加载模板渲染页面

    :return:
    """
    user = g.user
    if not user:
        return redirect('/')
    # 用户存在加载模板
    data = {
        'user': user.to_dict()
    }
    return render_template('news/user.html', data=data)


@profile_api.route('/base_info', methods=['GET', 'POST'])
@login_required
def base_info():
    """
    用户基本信息
    1 查看用户是否存在
    2 不存在重定向到主页面
    3 查看用户请求是否为get,get加载模板页面
    4 获取参数
    5 校验参数
    6 修改用户数据
    7 提交
    8 返回结果
    :return:
    """
    user = g.user
    if not user:
        return redirect('/')
    # 判断请求参数
    if request.method == 'GET':
        data = {
            'user': user.to_dict()
        }
        return render_template('news/user_base_info.html', data=data)
    # 接收参数
    nick_name = request.json.get('nick_name')
    signature = request.json.get('signature')
    gender = request.json.get('gender')
    print([nick_name, signature, gender])
    # 校验数据
    if not all([nick_name, signature, gender]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    # 判断性别
    if gender not in ['MAN', 'WOMAN']:
        return jsonify(errno=RET.PARAMERR, errmsg='性别参数不正确')
    # 修改数据
    user.signature = signature
    user.nick_name = nick_name
    user.gender = gender
    # 提交
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')
    #修改redis数据
    session['nick_name'] = nick_name
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK')


@profile_api.route('/pic_info', methods=['GET', 'POST'])
@login_required
def pic_info():
    """
    图片上传和加载
    1 判断用户是否登陆
    2 判断用户的请求
    3 接收图片数据
    4 尝试读取图片
    5 将图片上传到七牛云
    6 获取七牛云返回名称
    7 将名称存储到mysql
    9 拼接图片地址
    8 返回结果
    :return:
    """
    user = g.user
    if not user:
        return redirect('/')
    # 判断用户请求
    if request.method == 'GET':
        return render_template('news/user_pic_info.html', data={
            'user': user.to_dict()
        })
    # 接收图片数据
    avatar = request.files.get('avatar')
    # 判断数据存在
    if not avatar:
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    # 读取数据
    try:
        image_data = avatar.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='图片读取失败')
    # 调用七牛云上传数据
    try:
        image_name = storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='第三方错误')
    # 拼接文件名存储到mysql中,不需要拼接
    user.avatar_url = image_name
    # 提交
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')
    # 存储图片到session中
    image_url = constants.QINIU_DOMIN_PREFIX + user.avatar_url
    session['avatar_url'] = image_url
    # 返回数据
    return jsonify(errno=RET.OK, errmsg='OK', data={
        'avatar_url': image_url
    })


@profile_api.route('/pass_info', methods=['GET', 'POST'])
@login_required
def pass_info():
    """
    修改密码: 获取参数,校验参数,处理请求,返回结果
    1 校验用户登陆
    2 get请求返回模板
    3 获取参数
    4 校验参数
    5 修改数据
    6 返回数据
    :return:
    """
    user = g.user
    if not user:
        return redirect('/')
    # get请求
    if request.method == 'GET':
        return render_template('news/user_pass_info.html', data={'user': user.to_dict()})
    # 获取参数
    old_password = request.json.get('old_password')
    new_password = request.json.get('new_password')
    # 校验参数完整和密码正确
    if not all([old_password,new_password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    # 密码
    if not user.check_password(old_password):
        return jsonify(errno=RET.PARAMERR, errmsg='密码不正确')
    # 修改
    user.password = new_password
    # 提交
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')
    # 清除session信息
    session.pop('nick_name')
    session.pop('mobile')
    session.pop('user_id')
    # 返回数据
    return jsonify(errno=RET.OK, errmsg='OK')


@profile_api.route('/news_release', methods=['GET', 'POST'])
@login_required
def news_release():
    """
    新闻发布
    1 h获取用户信息
    2 请求类型
    3 查询新闻分类
    4 判断查询结果
    5 定义容器,遍历查询
    6 通过模板传入分类数据

    7 如果是post请求
    8 获取参数,因为前段有图片文件,所以使用的是表单传入数据,需要使用request.form
    9 检查参数的完整性
    10 需要对分类id和读取图片文件
    11 保存新闻数据,新闻的userid /新闻的来源/新闻的状态默认1审核中
    12 提交新闻
    13 返回结果
    :return:
    """
    user = g.user
    if not user:
        return redirect('/')
    # 判断请求
    if request.method == 'GET':
        # 查询分类数据
        try:
            categories = Category.query.all()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='数据库查询异常')
    # 判断查询结果
        if not categories:
            return jsonify(errno=RET.NODATA, errmsg='无分类数据')
        # 定义容器
        categories_list = []
        # 遍历查询结果
        for category in categories:
            categories_list.append(category.to_dict())
        # 从列表中弹出第0个索引值
        categories_list.pop(0)
        data = {
            'categories': categories_list
        }
        return render_template('news/user_news_release.html', data=data)

    # Post请求 获取表单数据
    title = request.form.get('title')
    digest = request.form.get('digest')
    category_id = request.form.get('category_id')
    index_image = request.files.get('index_image')
    content = request.form.get('content')
    # 检查参数完整性
    if not all([title, digest, category_id, index_image, content]):
        print([title, digest, category_id, index_image, content])
        return jsonify(errno=RET.PARAMERR, errmsg='数据缺失')
    # 检查参数,分类id
    try:
        category_id = int(category_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 读取图片数据
    try:
        image_data = index_image.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.IOERR, errmsg='文件读写错误')

    # 调用七牛云
    try:
        image_name = storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='第三方错误')
    # 保存新闻数据,构造新闻模型类对象
    news = News()
    news.title = title
    news.digest = digest
    news.category_id = category_id
    news.user_id = user.id
    news.content = content
    news.source = '个人发布'
    news.status = 1
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + image_name
    # 提交
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK')


@profile_api.route('/news_list', methods=['GET', 'POST'])
@login_required
def news_list():
    """
    新闻列表
    1 获取数据
    2
    :return:
    """
    user = g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg='')

    return render_template('news/user_news_list.html', data={'user': user.to_dict()})
